package org.rency.common.utils.tool;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import org.apache.commons.lang.StringUtils;

public class Utils {
		
	/**
	 * 获取HTTP请求最后修改时间
	 * </br>Created on 2016年1月7日
	 * @param lastModified
	 * @return
	 * @throws ParseException
	 */
	public static String parseLastModified(String lastModified) throws ParseException{
		try {
			if(StringUtils.isBlank(lastModified)){
				return DateUtils.getNowDateTime();
			}
		    SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.US);  
		    Date date = sdf.parse(lastModified);
		    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(date);
		} catch (ParseException e) {
			throw e;
		}
	}
	
	/**
	 * 线程休眠(单位:秒)
	 * </br>Created on 2016年3月16日
	 * @param sleep 休眠时间,单位:秒
	 */
	public static void trySleep(long sleep){
		try {
			Thread.sleep(sleep * 1000);
		} catch (InterruptedException e) {
		}
	}
    
    /**
     * 将数组转换成<code>List</code>。
     * <p>
     * 如果输入数组为<code>null</code>，则返回<code>null</code>。
     * </p>
     * <p>
     * 该方法返回的列表为指定数组的复本，而<code>java.util.Arrays.asList</code>方法所返回的列表为指定数组的映像（固定长度）。
     * </p>
     * <p>
     * 这个方法常被用于初始化，例如：
     * <pre>
     * List myList      = ArrayUtil.toList(new String[] { "aaa", "bbb", "ccc" });
     * List singleList  = ArrayUtil.toList("hello");     // 返回单个元素的列表["hello"]
     * </pre>
     * </p>
     * @param array 要转换的数组
     * @return 被创建的list
     */
    @SuppressWarnings("rawtypes")
	public static List toList(Object array) {
        return toList(array, null);
    }
    
    /**
     * 将数组转换成<code>List</code>。
     * <p>
     * 如果输入数组为<code>null</code>，则返回<code>null</code>。
     * </p>
     * <p>
     * 该方法返回的列表为指定数组的复本，而<code>java.util.Arrays.asList</code>方法所返回的列表为指定数组的映像（固定长度）。
     * </p>
     * <p>
     * 这个方法常被用于初始化，例如：
     * <pre>
     * List myList      = ArrayUtil.toList(new String[] { "aaa", "bbb", "ccc" }, new ArrayList());
     * List singleList  = ArrayUtil.toList("hello", new ArrayList());     // 返回单个元素的列表["hello"]
     * </pre>
     * </p>
     * @param array 要转换的数组
     * @param list 要填充的列表，如果是<code>null</code>，则创建之
     * @return 被创建或填充的list
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
	public static List toList(Object array, List list) {
        if (array == null) {
            return list;
        }

        // 非array，创建一个只有一个元素的列表
        if (!array.getClass().isArray()) {
            if (list == null) {
                list = new ArrayList(1);
            }

            list.add(array);
        } else if (array instanceof long[]) {
            long[] longArray = (long[]) array;

            if (list == null) {
                list = new ArrayList(longArray.length);
            }

            for (int i = 0; i < longArray.length; i++) {
                list.add(new Long(longArray[i]));
            }
        } else if (array instanceof int[]) {
            int[] intArray = (int[]) array;

            if (list == null) {
                list = new ArrayList(intArray.length);
            }

            for (int i = 0; i < intArray.length; i++) {
                list.add(new Integer(intArray[i]));
            }
        } else if (array instanceof short[]) {
            short[] shortArray = (short[]) array;

            if (list == null) {
                list = new ArrayList(shortArray.length);
            }

            for (int i = 0; i < shortArray.length; i++) {
                list.add(new Short(shortArray[i]));
            }
        } else if (array instanceof byte[]) {
            byte[] byteArray = (byte[]) array;

            if (list == null) {
                list = new ArrayList(byteArray.length);
            }

            for (int i = 0; i < byteArray.length; i++) {
                list.add(new Byte(byteArray[i]));
            }
        } else if (array instanceof double[]) {
            double[] doubleArray = (double[]) array;

            if (list == null) {
                list = new ArrayList(doubleArray.length);
            }

            for (int i = 0; i < doubleArray.length; i++) {
                list.add(new Double(doubleArray[i]));
            }
        } else if (array instanceof float[]) {
            float[] floatArray = (float[]) array;

            if (list == null) {
                list = new ArrayList(floatArray.length);
            }

            for (int i = 0; i < floatArray.length; i++) {
                list.add(new Float(floatArray[i]));
            }
        } else if (array instanceof boolean[]) {
            boolean[] booleanArray = (boolean[]) array;

            if (list == null) {
                list = new ArrayList(booleanArray.length);
            }

            for (int i = 0; i < booleanArray.length; i++) {
                list.add(booleanArray[i] ? Boolean.TRUE
                                         : Boolean.FALSE);
            }
        } else if (array instanceof char[]) {
            char[] charArray = (char[]) array;

            if (list == null) {
                list = new ArrayList(charArray.length);
            }

            for (int i = 0; i < charArray.length; i++) {
                list.add(new Character(charArray[i]));
            }
        } else {
            Object[] objectArray = (Object[]) array;

            if (list == null) {
                list = new ArrayList(objectArray.length);
            }

            for (int i = 0; i < objectArray.length; i++) {
                list.add(objectArray[i]);
            }
        }

        return list;
    }

    /**
     * 取得最小数。
     * @param a 整数1
     * @param b 整数2
     * @param c 整数3
     *
     * @return 三个数中的最小值
     */
    public static int min(int a, int b, int c) {
        if (b < a) {
            a = b;
        }

        if (c < a) {
            a = c;
        }
        return a;
    }
    
}